# [Spring Boot] Test Code


# ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•˜λŠ” 이유

  • κ°œλ°œλ‹¨κ³„ μ΄ˆκΈ°μ— 문제λ₯Ό λ°œκ²¬ν•  수 있음
  • λ‚˜μ€‘μ— μ½”λ“œλ₯Ό λ¦¬νŒ©ν† λ§ν•˜κ±°λ‚˜ 라이브러리 μ—…κ·Έλ ˆμ΄λ“œ μ‹œ κΈ°μ‘΄ κΈ°λŠ₯이 잘 μž‘λ™ν•˜λŠ” 지 확인 κ°€λŠ₯함
  • κΈ°λŠ₯에 λŒ€ν•œ λΆˆν™•μ‹€μ„± κ°μ†Œ

개발 μ½”λ“œ 이외에 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 일은 개발 μ‹œκ°„μ΄ λŠ˜μ–΄λ‚  것이라고 생각할 수 μžˆλ‹€. ν•˜μ§€λ§Œ λ‚΄ μ½”λ“œμ— 였λ₯˜κ°€ μžˆλŠ” 지 검증할 λ•Œ, ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•Šκ³  μ§„ν–‰ν•œλ‹€λ©΄ 더 μ‹œκ°„ μ†Œλͺ¨κ°€ 클 것이닀.

1. μ½”λ“œλ₯Ό μž‘μ„±ν•œ λ’€ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜μ—¬ μ„œλ²„λ₯Ό 킨닀.
2. API ν”„λ‘œκ·Έλž¨(ex. Postman)으둜 HTTP μš”μ²­ ν›„ κ²°κ³Όλ₯Ό Print둜 μ°μ–΄μ„œ ν™•μΈν•œλ‹€.
3. κ²°κ³Όκ°€ μ˜ˆμƒκ³Ό λ‹€λ₯΄λ©΄, λ‹€μ‹œ ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•œ λ’€ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜κ³  λ°˜λ³΅ν•œλ‹€.

μœ„μ™€ 같은 방식이 μ–Όλ§ˆλ‚˜ 반볡될 지 λͺ¨λ₯Έλ‹€. 그리고 ν•˜λ‚˜μ˜ κΈ°λŠ₯λ§ˆλ‹€ μ €λ ‡κ²Œ ν…ŒμŠ€νŠΈλ₯Ό ν•˜λ©΄ μ„œλ²„λ₯Ό ν‚€κ³  λ„λŠ” μž‘μ—… λ˜ν•œ λ„ˆλ¬΄ λΉ„νš¨μœ¨μ μ΄λ‹€.

이 밖에도 Print둜 눈으둜 κ²€μ¦ν•˜λŠ” 것도 μ–΄λŠμ •λ„ μ„ μ—μ„œ ν•œκ³„κ°€ μžˆλ‹€. ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” μžλ™μœΌλ‘œ 검증을 ν•΄μ£ΌκΈ° λ•Œλ¬Έμ— μ„±κ³΅ν•œλ‹€λ©΄ μˆ˜λ™μœΌλ‘œ 검증할 ν•„μš” μžμ²΄κ°€ 없어진닀.

μƒˆλ‘œμš΄ κΈ°λŠ₯이 μΆ”κ°€λ˜μ—ˆμ„ λ•Œλ„ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 톡해 λ§Œμ•½ 기쑴의 μ½”λ“œμ— 영ν–₯이 κ°”λ‹€λ©΄ μ–΄λ–€ 뢀뢄을 μˆ˜μ •ν•΄μ•Ό ν•˜λŠ” 지 μ•Œ 수 μžˆλŠ” μž₯점도 μ‘΄μž¬ν•œλ‹€.


λ”°λΌμ„œ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” κ°œλ°œν•˜λŠ” 데 μžˆμ–΄μ„œ ν•„μˆ˜μ μΈ 뢀뢄이며 λ°˜λ“œμ‹œ ν™œμš©ν•΄μ•Ό ν•œλ‹€.


# ν…ŒμŠ€νŠΈ μ½”λ“œ 예제

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HomeController.class)
public class HomeControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void home_return() throws Exception {
        //when
        String home = "home";

        //then
        mvc.perform(get("/home"))
                .andExpect(status().isOk())
                .andExpect(content().string(home));
    }
}

  1. @RunWith(SpringRunner.class)

ν…ŒμŠ€νŠΈλ₯Ό 진행할 λ•Œ JUnit에 λ‚΄μž₯된 μ‹€ν–‰μž 외에 λ‹€λ₯Έ μ‹€ν–‰μžλ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€.

μŠ€ν”„λ§ λΆ€νŠΈ ν…ŒμŠ€νŠΈμ™€ JUnit μ‚¬μ΄μ˜ μ—°κ²°μž 역할을 ν•œλ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€.

  1. @WebMvcTest

컨트둀러만 μ‚¬μš©ν•  λ•Œ 선언이 κ°€λŠ₯ν•˜λ©°, Spring MVC에 집쀑할 수 μžˆλŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‹€.

  1. @Autowired

μŠ€ν”„λ§μ΄ κ΄€λ¦¬ν•˜λŠ” Bean을 μ£Όμž…μ‹œμΌœμ€€λ‹€.

  1. MockMvc

μ›Ή APIλ₯Ό ν…ŒμŠ€νŠΈν•  λ•Œ μ‚¬μš©ν•˜λ©°, 이λ₯Ό 톡해 HTTP GET, POST, DELETE 등에 λŒ€ν•œ API ν…ŒμŠ€νŠΈκ°€ κ°€λŠ₯ν•˜λ‹€.

  1. mvc.perform(get("/home"))

/home μ£Όμ†Œλ‘œ HTTP GET μš”μ²­μ„ ν•œ 상황이닀.

  1. .andExpect(status().isOk())

κ²°κ³Όλ₯Ό κ²€μ¦ν•˜λŠ” andExpect둜, μ—¬λŸ¬κ°œλ₯Ό λΆ™μ—¬μ„œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€. status()λŠ” HTTP Headerλ₯Ό κ²€μ¦ν•˜λŠ” κ²ƒμœΌλ‘œ 결과에 λŒ€ν•œ HTTP Status μƒνƒœλ₯Ό 확인할 수 μžˆλ‹€. ν˜„μž¬ isOK()λŠ” 200 μ½”λ“œκ°€ λ§žλŠ”μ§€ ν™•μΈν•˜κ³  μžˆλ‹€.


ν”„λ‘œμ νŠΈλ₯Ό λ§Œλ“€λ©΄μ„œ λ‹€μ–‘ν•œ κΈ°λŠ₯듀을 κ΅¬ν˜„ν•˜κ²Œ λ˜λŠ”λ°, 이처럼 ν…ŒμŠ€νŠΈ μ½”λ“œλ‘œ κ²¬κ³ ν•œ ν”„λ‘œμ νŠΈλ₯Ό λ§Œλ“€κΈ° μœ„ν•œ κΈ°λŠ₯별 λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜λŠ” μŠ΅κ΄€μ„ κΈΈλŸ¬μ•Ό ν•œλ‹€.



# [참고 자료]

μ΅œμ’… μˆ˜μ • : 12/17/2022, 7:23:59 AM